package java_test.network.socket_test.uplodfile;

import java.net.*;
import java.io.*;
import java.util.Random;

/*
 *  TCP 图片上传服务器
 *  实现步骤：
 *      1. 创建ServerSocket套接字对象，绑定监听端口号8000
 *      2. 方法accept()获得客户端的连接对象
 *      3. 客户端连接对象获取字节输入流，读取客户端发送的图片
 *      4. 创建File对象，绑定上传文件夹    (判断文件件是否存在，若不存在，创建文件夹)
 *      5. 创建字节输出流，数据目的是File对象所在的文件夹
 *      6. 字节流读取图片，字节流将图片写到指定文件夹中
 *      7. 将“上传成功”返回客户端
 *      8. 关闭资源
 *
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8000);
        // 调用对象方法accept()获取客户端对象
        Socket socket = server.accept();
        //通过客户端连接对象，获取字节输入流，读取客户端发来的图片
        InputStream in = socket.getInputStream();
        // 将目的文件夹上传到File封装的文件夹
        File upload = new File("C:\\Users\\Administrator\\Pictures\\upload");
        // 若不存在，则创建该文件夹
        if (!upload.exists())
            upload.mkdirs();

        // 防止文件同名被覆盖，重新定义文件夹名字      规则：usst+毫秒值+6位随机数
        String fileName = "usst" + System.currentTimeMillis() + new Random().nextInt(999999) + ".jpg";

        // 创建字节输出流，将图片写入到指定的文件夹中
        FileOutputStream fos = new FileOutputStream(upload + File.separator + fileName);

        // 读  写字节数组
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = in.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }


        // 通过客户端连接对象获取字节输出流，将“上传成功”发送至客户端
        OutputStream out = socket.getOutputStream();
        out.write("上传成功".getBytes());

        fos.close();
        socket.close();
        server.close();
    }

}
